package model

import (
	"fmt"
	"github.com/zxmrlc/log"
	"github.com/spf13/viper"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//连接数据库
func openDB(username, password, addr, name string) *gorm.DB {
	config := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=%t&loc=%s",
	username,
	password,
	addr,
	name,
	true,
	//"Asia/Shanghai"),
	"Local")
	db, err := gorm.Open("mysql", config)
	if err != nil {
		log.Errorf(err, "Database connection failed. Database name: %s", name)
	}
	// 数据库设置
	setupDB(db)
	return db
}

// 数据库设置
func setupDB(db *gorm.DB) {
	db.LogMode(viper.GetBool("gormlog"))
	//db.DB().SetMaxOpenConns(20000)
	// ⽤于设置最⼤打开的连接数，默认值为0表示不限制.设置最⼤的连接数，可以避免并发太⾼导致连接mysql出现too many connections的错误。
	db.DB().SetMaxIdleConns(0)
	// ⽤于设置闲置的连接数.设置闲置的连接数则当开启的⼀个连接使⽤完成后可以放在池⾥等候下⼀次使⽤。
}

// 连接并设置数据库
func InitSelfDB() *gorm.DB {
	return openDB(viper.GetString("db.username"),
	viper.GetString("db.password"),
	viper.GetString("db.addr"),
	viper.GetString("db.name"))
}


type Database struct {
    Self   *gorm.DB
    // 如果想连接多个数据库如Docker，这里可以再加一个数据库
    // Docker *gorm.DB
}

var DB *Database

// Database结构体有个Init()方法用来初始化连接：
func (db *Database) Init() {
    DB = &Database {
        // Self:   GetSelfDB(),
        Self: InitSelfDB(),
    }
}

// 获取数据库
// func GetSelfDB() *gorm.DB {
//	return InitSelfDB()
//}

// 关闭数据库
func (db *Database) Close() {
	DB.Self.Close()
}


func main() {
	fmt.Println("vim-go")
}
